<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>


<script>


    /**
     * 3.利用构造函数创建对象
     * 构造函数是一种特殊的函数, 主要用来初始化对象, 即为对象成员变量赋初始值
     * 它总与 new 一起使用. 我们可以把对象中的一些公共的属性和方法抽取出来, 然后封装到这个函数里面
     * #
     * 在JS中, 使用构造函数时要注意以下两点:
     * 1.构造函数用于创建某一类对象, 其首字母要大写
     * 2.构造函数和 new 一起使用才有意义
     * @param uname
     * @param age
     * @constructor
     */
    function Star(uname, age) {
        // 构造函数中的属性和方法我们成为成员, 成员可以添加
        this.uname = uname;
        this.age = age;

        this.sing = function () {
            console.log('他会唱歌!');
        }
    }

    Star.prototype.dance = function () {
        console.log('我会跳舞!');
    }

    var ldh = new Star('刘德华', 18);
    var zxy = new Star('张学友', 18);
    // 1.实例成员就是构造函数内部通过this添加的成员, uname age sing 都是实例成员
    // 实例成员只能通过实例化的对象来访问
    console.log(ldh.uname)
    console.log(zxy)
    // console.log(Star.uname) // undefined 不可以通过构造函数俩访问实例成员

    ldh.sing();
    zxy.sing();

    // 2.静态成员在构造函数本身上添加的成员 sex 就是静态成员
    Star.sex = 'man';
    // 静态成员只能通过构造函数来访问
    console.log(Star.sex)
    console.log(ldh.sex)    // undefined 不能通过对象来访问

    console.log('-----------------------------------')
    ldh.dance();
    zxy.dance();
    console.log(`ldh.dance === zxy.dance : ${ldh.dance === zxy.dance}`)
    // 3.一般情况下, 我们的公共属性定义到构造函数里面, 公共的方法我们放到原型对象身上
</script>
</body>
</html>
